package com.itbaizhan.shopping_admin_service.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itbaizhan.shopping_admin_service.mapper.AdminMapper;
import com.itbaizhan.shopping_common.pojo.Admin;
import com.itbaizhan.shopping_common.pojo.Permission;
import com.itbaizhan.shopping_common.service.AdminService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.List;


/**
 * 管理员服务实现类
 */
@DubboService
@Transactional
@Service
public class AdminServiceImpl implements AdminService {
	
	@Autowired
	private AdminMapper adminMapper;
	
	/**
	 * 新增管理员
	 *
	 * @param admin
	 */
	public void add(Admin admin) {
		adminMapper.insert(admin);
	}
	
	/**
	 * 修改管理员
	 *
	 * @param admin
	 */
	public void update(Admin admin) {
		// 如果前端传来空密码，则密码还是原来的密码
		if(!StringUtils.hasText(admin.getPassword())){
			// 查询原来的密码
			String password = adminMapper.selectById(admin.getAid()).getPassword();
			admin.setPassword(password);
		}
		adminMapper.updateById(admin);
	}
	
	/**
	 * 删除管理员
	 * 删除管理员之前，先删除该管理员和角色的关联关系
	 *
	 * @param id
	 */
	public void delete(Long id) {
		adminMapper.deleteAdminAllRole(id);
		adminMapper.deleteById(id);
	}
	
	/**
	 * 根据id查询管理员
	 *
	 * @param id
	 * @return
	 */
	public Admin findById(Long id) {
		return adminMapper.findById(id);
	}
	
	/**
	 * 分页查询管理员
	 *
	 * @param page 表示当前请求的是第几页的数据
	 * @param size 表示每一页包含的数据条目数量，即页面大小。
	 * @return
	 */
	public Page<Admin> search(int page, int size) {
		//传入分页条件，返回分页对象
		return adminMapper.selectPage(new Page<>(page, size), null);
	}
	
	/**
	 * 修改管理员角色
	 *
	 * @param aid 管理员id
	 * @param rids 角色id数组
	 */
	public void updateRoleToAdmin(Long aid, Long[] rids) {
		//先删除所有管理员角色
		adminMapper.deleteAdminAllRole(aid);
		//再新增管理员角色
		for (Long rid : rids) {
			adminMapper.addRoleToAdmin(aid, rid);
		}
	}
	
	/**
	 * 认证授权逻辑认证时相关方法
	 * 根据管理员用户名查询管理员
	 * @param username
	 * @return
	 */
	public Admin findByAdminName(String username) {
		// 使用条件构造器QueryWrapper创建查询条件
		QueryWrapper<Admin> wrapper = new QueryWrapper();
		wrapper.eq("username", username);
		Admin admin = adminMapper.selectOne(wrapper);
		return admin;
	}
	
	/**
	 * 认证授权逻辑授权时相关方法
	 * 根据管理员用户名查询权限
	 * @param username
	 * @return
	 */
	public List<Permission> findAllPermission(String username) {
		return adminMapper.findAllPermission(username);
	}
}
